[Design pattern]: 设计模式相关系列
介绍
概念: 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
应用场景: 不同功能的模块之间调用关系复杂,耦合度高,不利于修改时使用。
好处: 降低耦合,模块独立。
坏处: 中介者业务复杂,不易维护。
CODE
定义模块抽象类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package note.com.mediator;
public abstract class Element { public Mediator mediator = null;
public abstract void good();
public abstract void bad();
public Mediator getMediator() { return mediator; }
public void setMediator(Mediator mediator) { this.mediator = mediator; }
public abstract void changeGood();
public abstract void changeBad(); }
|
模块具体实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| package note.com.mediator;
public class Army extends Element{
@Override public void good() { System.out.println("部队强大");
}
@Override public void bad() { System.out.println("部队弱小"); }
@Override public void changeGood() { getMediator().change(Mediator.ARMY, Mediator.GOOD); }
@Override public void changeBad() { getMediator().change(Mediator.ARMY, Mediator.BAD); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package note.com.mediator;
public class Goverment extends Element{
@Override public void good() { System.out.println("政府有钱"); }
@Override public void bad() { System.out.println("政府没钱"); }
@Override public void changeGood() { good(); getMediator().change(Mediator.GOVERMENT, Mediator.GOOD); }
@Override public void changeBad() { bad(); getMediator().change(Mediator.GOVERMENT, Mediator.BAD); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| package note.com.mediator;
public class People extends Element{
@Override public void good() { System.out.println("人民幸福"); }
@Override public void bad() { System.out.println("人民不幸福"); }
@Override public void changeGood() { good(); getMediator().change(Mediator.PEOPLE, Mediator.GOOD); }
@Override public void changeBad() { bad(); getMediator().change(Mediator.PEOPLE, Mediator.BAD); }
}
|
中介者,定义模块之间的调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| package note.com.mediator;
public class Mediator{ public static final String ARMY = "Army"; public static final String GOVERMENT = "Goverment"; public static final String PEOPLE = "People"; public static final String GOOD = "good"; public static final String BAD = "bad";
public Element a = null; public Element g = null; public Element p = null;
public Mediator(Army a,Goverment g,People p){ this.a = a; this.g = g; this.p = p; }
public void change(String label,String state){
if(ARMY.equals(label)){ if(GOOD.equals(state)){ g.good(); p.good(); }else if(BAD.equals(state)){ g.bad(); p.bad(); } }else if(GOVERMENT.equals(label)){ if(GOOD.equals(state)){ a.good(); p.good(); }else if(BAD.equals(state)){ a.bad(); p.bad(); }
}else if(PEOPLE.equals(label)){ if(GOOD.equals(state)){ a.good(); g.good(); }else if(BAD.equals(state)){ a.bad(); g.bad(); } } }
public Element getA() { return a; }
public void setA(Element a) { this.a = a; }
public Element getG() { return g; }
public void setG(Element g) { this.g = g; }
public Element getP() { return p; }
public void setP(Element p) { this.p = p; } }
|
测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package note.com.mediator;
public class MediatorTest { public static void main(String[] args) { Army a = new Army(); Goverment g = new Goverment(); People p = new People(); Mediator mediator = new Mediator(a,g,p); a.setMediator(mediator); g.setMediator(mediator); p.setMediator(mediator); a.changeBad(); System.out.println("===="); g.changeBad(); System.out.println("===="); p.changeGood(); } }
|
结果
1 2 3 4 5 6 7 8 9 10
| 政府没钱 人民不幸福 ==== 政府没钱 部队弱小 人民不幸福 ==== 人民幸福 部队强大 政府有钱
|
由此可以看出例子中的三个模块之间的调用关系由Mediator来控制,使三个模块更专心于自己的功能。
注意:小心设计成死循环。